package com.gl.glbooks.services;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.gl.glbooks.repository.GenericRepository;
import com.gl.glbooks.repository.JpaPrestamosRepository;
import com.gl.glbooks.spring.aop.aspectj.cache.Cachea;
import com.gl.glbooks.vos.Actividad;
import com.gl.glbooks.vos.Categoria;
import com.gl.glbooks.vos.Comentario;
import com.gl.glbooks.vos.Editorial;
import com.gl.glbooks.vos.Ejemplar;
import com.gl.glbooks.vos.EstadoPrestamo;
import com.gl.glbooks.vos.EstadoSugerencia;
import com.gl.glbooks.vos.EstadoSugerenciaPDFsubido;
import com.gl.glbooks.vos.Libro;
import com.gl.glbooks.vos.Oficina;
import com.gl.glbooks.vos.PalabraClave;
import com.gl.glbooks.vos.Prestamo;
import com.gl.glbooks.vos.Sugerencia;
import com.gl.glbooks.vos.SugerenciaPDFsubido;
import com.gl.glbooks.vos.Usuario;


public class ListarServices implements IListarServices {
	protected final Log logger = LogFactory.getLog(getClass());
	public List<Libro> libros = new ArrayList<Libro>();
	@Autowired
	GenericRepository repo;
	@Autowired
	JpaPrestamosRepository repoPrestamos;	


	/* Traemos el listado de sugerencias */
	public List<Sugerencia> listarSugerencias(){
		logger.info("getLibrosList");
		return (List<Sugerencia>) repo.getListCondicional(Sugerencia.class,"estadoSugerencia",EstadoSugerencia.sinRevisar);
	
	}
	/* Traemos el listado de sugerencias PDF subidos por el usuario */
	public List<SugerenciaPDFsubido> listarSugerenciasPDFsubido(){
		logger.info("getSugerenciasPDFList");
		return (List<SugerenciaPDFsubido>) repo.getListCondicional(SugerenciaPDFsubido.class,"estadoSugerenciaPDFsubido",EstadoSugerenciaPDFsubido.sinRevisar);

	}
	/* Traemos el listado de libros */
	@Cachea(cacheKey="libros", expireTime=0)
	public List<Libro> listarLibros() {
		logger.info("getLibrosList");
		return (List<Libro>) repo.getListSinBaja(Libro.class,"fechaBaja");

	}

	/* Traemos el listado de ejemplares */
	public List<Ejemplar> listarEjemplares() {
		logger.info("getEjemplaresList");
		return repo.getList(Ejemplar.class);
	}

	/* Traemos el listado de prestamos */
	public List<Prestamo> listarPrestamos() {
		logger.info("getPrestamosList");
		return (List<Prestamo>) repo.getListCondicionalExclude(Prestamo.class,"estadoPrestamo",EstadoPrestamo.finalizado);
	}

	/* Traemos el listado de categorias */
	@Cachea(cacheKey="categorias", expireTime=0)
	public List<Categoria> listarCategorias() {
		logger.info("getCategoriasList");
		return repo.getList(Categoria.class);
	}

	/* Traemos el listado de editoriales */
	@Cachea(cacheKey="editoriales", expireTime=0)
	public List<Editorial> listarEditoriales() {
		logger.info("getEditorialesList");
		return repo.getList(Editorial.class);
	}

	/* Traemos el listado de oficinas */
	@Cachea(cacheKey="oficinas", expireTime=0)
	public List<Oficina> listarOficinas() {
		logger.info("getOficinasList");
		return repo.getList(Oficina.class);
	}

	/* Traemos el listado de usuarios */
	public List<Usuario> listarUsuarios() {
		logger.info("getUsuariosList");
		return repo.getList(Usuario.class);
	}

	/* Traemos el listado de Palabras Claves */
	@Cachea(cacheKey="palabrasClaves", expireTime=0)
	public List<PalabraClave> listarPalabrasClaves() {
		logger.info("getPalabrasClavesList");
		return repo.getList(PalabraClave.class);
	}

	public List<Actividad> listarActividadesEntreFechas( Date fechaDesde, Date fechaHasta ) {
		logger.info("listarActividadesEntreFechas");
		return repo.findBetweenDates( Actividad.class, "fecha", fechaDesde, fechaHasta );
	}

	public List<Usuario> listarUsuariosResponsables() {
		logger.info("getUsuariosListResp");
		return repo.getListBusqueda(Usuario.class, "responsabilidad", "responsable");
	}
	
	public List<Prestamo>listarPrestamosPorFecha(Date fechaHasta){
		logger.info("getPrestamosListResp");
		return repoPrestamos.getListBusquedaDate("fechaHasta",fechaHasta);
	}
	
	public List<Prestamo> listarPrestamosPorFechaMenor(Date time){
		logger.info("getPrestamosListResp");
		return repoPrestamos.getListBusquedaDateMayor("fechaHasta",time);
	}

	public List<Comentario> listarComentariosNovedosos(int cantidad) {
		logger.info("listarComentariosNovedosos");
		return repo.getListComentariosNovedosos(Comentario.class, cantidad );
	}

	public List<Comentario> listarComentarios() {
		logger.info("getComentariosList");
		return repo.getList(Comentario.class);
	}
		
	public List<Libro> listarLibrosNovedosos(int cantidad) {
		logger.info("listarEjemplaresNovedosos");
		return repo.getListLibrosNovedosos(Ejemplar.class, cantidad );
	}

}
